package com.wang.abstractrouting.datasource;

import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLTimeoutException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;

/**
 * DynamicDataSource继承AbstractRoutingDataSource在代码中选择使用的数据源
 * 存在问题：
 *  存在硬编码，代码耦合度高
 *
 * @author: wangning1@abupdate.com
 * @date: 2023-12-18 18:54
 **/
@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {

    //使用ThreadLocal而不是String，可以在多线程的时候保证数据的可靠性
    public static ThreadLocal<String> flag = new ThreadLocal<>();

    @Resource
    private DataSource dataSource1;

    @Resource
    private DataSource dataSource2;


    /**
     * 返回当前数据源标识
     *
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return flag.get();
    }

    @Override
    public void afterPropertiesSet() {
        Map<Object,Object> targetDataSource = new ConcurrentHashMap<>();
        targetDataSource.put("source1",dataSource1);
        targetDataSource.put("source2",dataSource2);
        // 将Map对象赋值给AbstrictRoutingDataSource内部的Map对象中。
        super.setTargetDataSources(targetDataSource);

        // 将第一个数据源设置为默认的数据源。
        super.setDefaultTargetDataSource(dataSource1);

        super.afterPropertiesSet();
    }
}